package com.c2b.algorithm.leetcode.jzoffer;

/**
 * <a href="https://www.nowcoder.com/practice/0c1b486d987b4269b398fee374584fc8?tpId=13&tqId=2221866&ru=%2Fpractice%2F1624bc35a45c42c0bc17d17fa0cba788&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=">调整数组顺序使奇数位于偶数前面(二)</a>
 * <p>输入一个长度为 n 整数数组，数组里面可能含有相同的元素，实现一个函数来调整该数组中数字的顺序，使得所有的奇数位于数组的前面部分，所有的偶数位于数组的后面部分，
 * 对奇数和奇数，偶数和偶数之间的相对位置不做要求，但是时间复杂度和空间复杂度必须如下要求。</p>
 *
 * <p>数据范围：0≤n≤50000，数组中每个数的值 0≤val≤10000</p>
 * <p>要求：时间复杂度O(n)，空间复杂度O(1)</p>
 *
 * @author c2b
 * @since 2023/3/9 10:22
 */
public class JzOffer0081ReOrderArrayTwo {

    public int[] reOrderArrayTwo(int[] array) {
        if (array == null || array.length == 1) {
            return array;
        }
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            // 左边是偶数。右边是奇数
            if (array[left] % 2 == 0 && array[right] % 2 == 1) {
                // 交换位置
                int temp = array[left];
                array[left] = array[right];
                array[right] = temp;
                left++;
                right--;
            } else {
                // 左边是奇数
                if (array[left] % 2 == 1) {
                    left++;
                }
                // 右边是偶数
                if (array[right] % 2 == 0) {
                    right--;
                }
            }
        }
        return array;
    }

    public static void main(String[] args) {
        JzOffer0081ReOrderArrayTwo jzOffer0081ReOrderArrayTwo = new JzOffer0081ReOrderArrayTwo();
        int[] ints = jzOffer0081ReOrderArrayTwo.reOrderArrayTwo(new int[]{1,4,4,3});
        for (int anInt : ints) {
            System.out.println(anInt);
        }
    }
}
